#ifndef SC_EVENTS_H
#define SC_EVENTS_H

#include "common.h"

#include <stdbool.h>
#include <stdint.h>
#include <SDL_events.h>

// SDL_USEREVENT 是SDL2.0后定义的一个用户自定义事件，由用户自主定义并使用源码中这个事件后面预留了空间供用户自定义
// 参考地址：https://wiki.libsdl.org/SDL2/SDL_UserEvent

// 下面的事件码在原来的版本中是使用的宏定义，从2.7开始转成了枚举
// 比较两种定义的优缺点！
enum {
    /* 收到新的视频帧 */
    SC_EVENT_NEW_FRAME = SDL_USEREVENT,
    SC_EVENT_RUN_ON_MAIN_THREAD,
    /* 与android设备断开连接事件码 */
    SC_EVENT_DEVICE_DISCONNECTED,
    /* 与android设备连接失败事件码 */
    SC_EVENT_SERVER_CONNECTION_FAILED,
    /* 与android设备连接成功事件码 */
    SC_EVENT_SERVER_CONNECTED,
    // USB设备断开连接
    SC_EVENT_USB_DEVICE_DISCONNECTED,
    // 解复用器出错
    SC_EVENT_DEMUXER_ERROR,
    // 录屏事件错误
    SC_EVENT_RECORDER_ERROR,
    // 屏幕尺寸
    SC_EVENT_SCREEN_INIT_SIZE,
    SC_EVENT_TIME_LIMIT_REACHED,
    SC_EVENT_CONTROLLER_ERROR,
    SC_EVENT_AOA_OPEN_ERROR,
};

bool
sc_push_event_impl(uint32_t type, const char *name);

#define sc_push_event(TYPE) sc_push_event_impl(TYPE, # TYPE)

typedef void (*sc_runnable_fn)(void *userdata);

bool
sc_post_to_main_thread(sc_runnable_fn run, void *userdata);

void
sc_reject_new_runnables(void);

#endif
